#include "Defmt.hpp"
#include "MyClang/clang.h"

using namespace Defmt;
using namespace Upp;

const char * FILENAME = "defmt_info.csv";

LogManager::LogManager()
{
    logitems.Clear();
}

LogManager::~LogManager()
{
    SaveFile();
}

void LogManager::SaveFile()
{
    //将logitems保存到文件
}

void LogManager::ParseCSVFile()
{
    //解析文件
    //1. 解析文件中的每一行
    //2. 每一行的格式为：id,str,arg1,arg2,arg3...
    //3. 将每一行解析为一个LogItem
    //4. 将LogItem添加到logitems中
    String filename = path + FILENAME;
    if (!FileExists(filename))
    {
        return;
    }
    FileIn in(filename);
    while (!in.IsEof())
    {
        String line = in.GetLine();
        StringStream ss(line);
        Vector<String> items = GetCsvLine(ss, ',', CHARSET_DEFAULT);
        if (!items.IsEmpty())
        {
            //id,str,arg1,arg2,arg3...
            LogItem &item = logitems.Add(); 
            item.str_id = ScanInt(items[0]);
            // item.str = items[1];
            for (int i = 2; i < items.GetCount(); i++)
            {
                LogArg &arg = item.args.Add();
                arg.name = items[i];
                arg.value = Null;
            }
        }
    }
}

void LogManager::ParseFile(String &file)
{
    //1. 遍历文件路径下的所有C文件(.c,.h,.cpp,.hpp)
    //2. 查找关键字QM_DEFMT_SID
    //  2.1 如果QM_DEFMT_SID("xxx") 则需要将字符串转换成ID, 
    //  2.2 如果QM_DEFMT_SID(xxx) 表示已经转换过了，不需要转换
    if (!FileExists(file))
    {
        return ;
    }

    FileIn in(file);
    //check QM_DEFMT_SID is in file
    bool has_defmt_sid = false;
    while (!in.IsEof())
    {
        String line = in.GetLine();
        if (line.Find("QM_DEFMT_SID") >= 0)
        {
            has_defmt_sid = true;
            break;
        }
    }
    if (!has_defmt_sid)
    {
        return;
    }
    else
    {
        //DUMP(v.info);
    }

}

//void LogManager::OnFileChange(const std::wstring& file, const filewatch::Event event_type)
//{
//
//}

void LogManager::ParsePath()
{
    //遍历文件路径

    if (!DirectoryExists(path))
    {
        return;
    }

    Vector<String> files = FindAllPaths(path, "*.c *.cpp *.h *.hpp");
    if (files.IsEmpty())
    {
        return;
    }
    for (auto &file : files)
    {
        ParseFile(file);
    }
    
}

void LogManager::SetPath(String &setpath)
{
    //设置文件路径
    //1. 当文件路径改变时，将原来的文件保存。并更改到新的文件路径
    //2. 当文件路径中的文件不存在时，创建文件
    //3. 当文件路径中的文件存在时，解析文件
    //4. 文件名称固定为defmt_info.csv

    if (!DirectoryExists(setpath))
    {
        return;
    }

    if (setpath == path)
    {
        return;
    }

    if (logitems.GetCount() > 0)
    {
        SaveFile();
    }
    path = setpath;
    logitems.Clear();

    //文件是否存在，不存在则创建
    if (!FileExists(path + FILENAME))
    {
        //create file 
        FileOut out(path + FILENAME);
        out.Close();
    }
    else
    {
        ParseCSVFile();
    }

    //force re-parse all files in path
    ParsePath();

    // if (watch)
    // {
    //     delete watch;
    // }
    // watch = new filewatch::FileWatch<std::wstring>(path.ToWString(), THISBACK(OnFileChange));

}
